package pers.cjr.demo.model.entity;

import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import pers.cjr.common.validator.BizUpdate;


/**
 * 实体父类
 * <p>
 * 特殊说明：
 * 继承此基类的实体类，如果使用lombok的@Data注解时，主要同时添加@EqualsAndHashCode(callSuper = true)注解
 * 1)注解@EqualsAndHashCode(callSuper = true)，就是用自己的属性和从父类继承的属性来生成hashcode；
 * 2)注解@EqualsAndHashCode(callSuper = false)，就是只用自己的属性来生成hashcode；
 * 3)@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集, 和@EqualsAndHashCode默认是false。
 * <p>
 * MappedSuperclass注解说明：
 * 1.@MappedSuperclass注解仅仅能标准在类上；这个注解标识在父类上面的，用来标识父类
 * 2.标注为@MappedSuperclass的类将不是一个完整的实体类，他将不会映射到数据库表，可是他的属性都将映射到其子类的数据库字段中
 * 3.标注为@MappedSuperclass的类不能再标注@Entity或@Table注解
 * <p>
 * EntityListeners注解及相关说明：
 * EntityListeners：该注解用于指定Entity或者superclass上的回调监听类
 * AuditingEntityListener：这是一个JPA Entity Listener，用于捕获监听信息，当Entity发生持久化和更新操作时
 */
@SuperBuilder   // @SuperBuilder支持对基类成员属性的构造；如果子类继承了BaseModel，也需要使用该注解
@AllArgsConstructor // 全参构造函数
@NoArgsConstructor  // 空参构造函数
@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class JpaBaseModel implements Serializable {

    @NotNull(message = "ID不能为NUll", groups = {BizUpdate.class})
    @ApiModelProperty(value = "主键ID", required = true, example = "1")
    @Id
    @Column(name = "id", columnDefinition = "int(10) COMMENT '自增长ID'")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ApiModelProperty(value = "创建时间", required = false)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @Column(name = "create_time", updatable = false, columnDefinition = "datetime not null COMMENT '创建时间'")
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    @ApiModelProperty(value = "创建人ID", required = false)
    @Column(name = "create_by", updatable = false, columnDefinition = "int(10) not null COMMENT '创建人ID'")
    private Integer createBy;

    @ApiModelProperty(value = "更新时间", required = false)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @Column(name = "update_time", columnDefinition = "datetime COMMENT '更新时间'")
    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;

    @ApiModelProperty(value = "更新人ID", required = false)
    @Column(name = "update_by", columnDefinition = "int(10) COMMENT '更新人ID'")
    private Integer updateBy;

    @Column(name = "deleted", columnDefinition = "tinyint(1) COMMENT '是否删除 0否 1是'")
    private Integer deleted;
}
